//
// Created by Administrator on 2021/9/26.
// 1、存取各分量（x,y,z）
// 2、向量间复制操作
// 3、比较向量是否相同
// 4、把向量置为0向量
// 5、向量求负
// 6、求向量的模
// 7、向量 */ 标量
// 8、向量标准化
// 9、向量加减
// 10、计算两点间距离
// 11、向量点乘
// 12、向量叉乘
//
#ifndef MRENDER_VECTOR3_H
#define MRENDER_VECTOR3_H
#include <cmath>
#include "Angle.h"
#include "../core/String.h"
#include "../core/MAssert.h"

class Vector3 {
public:
    float x, y, z;
public:
    Vector3();
    ~Vector3();
    Vector3(float v[3]);
    Vector3(float nx, float ny, float nz);
    //复制
    Vector3(const Vector3 &v);

    static Vector3 zero();
    static Vector3 identity();

    //重写操作符
    Vector3 &operator= (const Vector3 &v);
    bool operator== (const Vector3 &v) const;
    bool operator!= (const Vector3 &v) const;
    Vector3 operator+ (const Vector3 &v) const;
    Vector3 operator- (const Vector3 &v) const;
    Vector3 operator* (float a) const;
    Vector3 operator/ (float a) const;

    float operator* (const Vector3 &v) const;

    float length();
    void normalize();

    String toString();

    /**
     * 向量相减
     */
    static Vector3 subtractVectors(const Vector3& v1, const Vector3& v2);

    /**
     * 计算两个向量的夹角
     * @param v1 向量1
     * @param v2 向量2
     * @return 角度
     */
    static float angle(Vector3 v1, Vector3 v2, AngleType angleType);

    /**
     * 标量左乘
     * @param f 标量
     * @param v2 向量
     * @return 结果
     */
    static Vector3 multiply(float f, Vector3 v2);

    /**
     * 点乘
     * @param v1 向量1
     * @param v2 向量2
     * @return 点乘结果
     */
    static float multiply(Vector3 v1, Vector3 v2);

    /**
     * 叉乘
     * @param v1 向量1
     * @param v2 向量2
     * @return 叉乘结果
     */
    static Vector3 crossProduct(const Vector3& v1, const Vector3& v2);

    /**
     * 两点间距离
     * @param v1 向量1
     * @param v2 向量2
     * @return 距离
     */
    static float distance(Vector3 v1, Vector3 v2);
};

#endif //MRENDER_VECTOR3_H
